/**
 *  putch()
 *  tisk na monitor na nejnizsi urovni
 */
void putch(char s) {
  if((s != '\r') && (s != '\n') && (s != '\t')) {
    asm xor al, al;
    asm mov cx, 1;
    asm xor bh, bh;
    asm mov bl, TEXT_COL;
    asm mov ah, 9;
    asm int 0x10;
  }

  /* '\n' == "\r\n" */
  if(s == '\n') {
    asm mov al, 0xd; /* 0xd == '\r' */
    asm mov ah, 0xe;
    asm mov bl, 7;
    asm int 0x10;
  }

  asm mov al, s;
  asm mov ah, 0xe;
  asm mov bl, 7;
  asm int 0x10;
  return;
}

/**
 *  cursor()
 *  zapne nebo vypne zobrazovani textoveho kurzoru
 */
void cursor(bool stat) {
  if (stat)
    asm mov cx, 0x0607;     /* zobrazi kurzor */
  else
    asm mov cx, 0x1400;     /* vypne kurzor */

    asm mov ah, 1 ;
    asm int 0x10  ;
  return;
}

/**
 *  getxy()
 *  zjisti v jakem radku (x) a sloupci (y) se nachazi textovy kurzor
 */
void getxy(int *x, int *y) {
  asm mov ah, 3;
  asm xor bh, bh;
  asm int 0x10;

  *x = _DH;
  *y = _DL;
  return;
}

/**
 *  gotoxy()
 *  posune textovy kurzor na radek x, sloupec y
 */
void gotoxy(char x, char y) {
  asm mov ah, 2;
  asm xor bh, bh;
  asm mov dh, x;
  asm mov dl, y;
  asm int 0x10;
  return;
}

/**
 *  vidmode()
 *  nastavi danne video mode pres int 10h,
 *  nejvhodnejsi mod v pomeru text/grafika je vidmode(0x10)
 */
void vidmode(int mode) {
  asm xor ah, ah;
  asm mov al, mode;
  asm int 0x10;
  return;
}

/**
 *  textcolor()
 *  zmeni barvu pisma na <col>
 */
void textcolor(unsigned char col) {
  TEXT_COL = col;
}

/**
 *  prowdown()
 *  prida <rows> prazdnych radku s barvou <mode> na zacatek obrazovky,
 *  maze radky ze~spoda. 0 maze obrazovku, nepresouva ukazatel
 */
void prowdown(int rows, int mode) {
  asm mov ah, 7;
  asm xor cx, cx;
  asm mov dh, 200;
  asm mov dl, 200;
  asm mov al, rows;
  asm mov bh, mode;
  asm int 0x10;
  return;
}

/**
 *  prowup()
 *  prida <rows> prazdnych radku s barvou <mode> na konec obrazovky,
 *  maze radky z~vrcha. 0 maze obrazovku, nepresouva ukazatel
 */
void prowup(int rows, int mode) {
  asm mov ah, 6;
  asm xor cx, cx;
  asm mov dh, 200;
  asm mov dl, 200;
  asm mov al, rows;
  asm mov bh, mode;
  asm int 0x10;
  return;
}
